package com.thinkgsp.jxc.persistence;

import java.math.BigDecimal;
import java.sql.Date;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.thinkgsp.jxc.model.RpBill;
import com.thinkgsp.jxc.model.RpBillDetail;

/**
 * 收款付款单持久化类
 * @author evan
 *
 */
public interface RpBillMapper {
	/**
	 * 获取收款付款单
	 * @param billId
	 * @return
	 */
	public <T extends RpBill> T getRpBill(Long billId);
	
	/**
	 * 获取收款付款单列表
	 * @param begDate
	 * @param endDate
	 * @param direct
	 * @return
	 */
	public <T extends RpBill> List<T> getRpBillList(@Param(value="begDate")Date begDate,@Param(value="endDate")Date endDate,@Param(value="direct")Integer direct);
	
	/**
	 * 获取收款付款单列表
	 * @param begDate
	 * @param endDate
	 * @param direct
	 * @return
	 */
	public <T extends RpBill> List<T> getRpBillListWithCust(@Param(value="begDate")Date begDate,@Param(value="endDate")Date endDate,@Param(value="custId")Integer custId,@Param(value="direct")Integer direct);
	
	/**
	 * 获取未核销的收付款单
	 * @param custId
	 * @param direct
	 * @return
	 */
	public <T extends RpBill> List<T> getUnCheckBills(@Param(value="custId")Integer custId,@Param(value="direct")Integer direct);
	
	/**
	 * 获取未核销的退款单
	 * @param custId
	 * @param direct
	 * @return
	 */
	public <T extends RpBill> List<T> getUnCheckRefundBills(@Param(value="custId") Integer custId,@Param(value="direct") Integer direct);
	
	
	/**
	 * 新增收付款单
	 * @param bill
	 */
	public void insertRpBill(RpBill bill);
	
	/**
	 * 新增收付款单明细
	 * @param detail
	 */
	public void insertRpBillDetail(RpBillDetail detail);
	
	/**
	 * 修改收付款单
	 * @param bill
	 */
	public int updateRpBill(RpBill bill);
	
	/**
	 * 修改收付款单明细
	 * @param detail
	 */
	public int updateRpBillDetail(RpBillDetail detail);
	
	/**
	 * 删除收付款单
	 * @param billId
	 * @return
	 */
	public int deleteRpBill(Long billId);
	
	/**
	 * 删除收付款单明细
	 * @param rpBillId
	 * @return
	 */
	public int deleteRpBillDetail(Long rpBillId);
	
	/**
	 * 删除收付款单明细中不存在数据库中的记录
	 * @param details
	 * @return
	 */
	public int deleteRpBillDetailNotIn(@Param(value="rpBillId")Long rpBillId,@Param(value="details") List<RpBillDetail> details);
	
	/**
	 * 单据核销
	 * @param billId
	 * @param amount 核销金额
	 * @return
	 */
	public int billCheck(@Param(value="billId")Long billId,@Param(value="amount")BigDecimal amount);
	
	/**
	 * 单据反核销
	 * @param billId
	 * @param amount
	 * @return
	 */
	public int billUnCheck(@Param(value="billId")Long billId,@Param(value="amount")BigDecimal amount);
	
	/**
	 * 单据归档
	 * @param billId
	 * @param archived true 归档；false 反归档
	 * @return
	 */
	public int billArchive(@Param(value="billId")Long billId,@Param(value="archived")Boolean archived);
}
